Qualcomm® AI Hub
Qualcomm AI Hub 包含大量预训练的 AI 模型,这些模型经过优化,可在 Dragonwing 硬件NPU上运行。
查找支持的模型
AI Hub 中的模型按支持的 Qualcomm 芯片组进行分类。查看在您的开发套件上运行的模型:
1️⃣ 前往 model list。
2️⃣ 在“芯片组”下,选择:
- RB3 Gen 2 Vision Kit: 'Qualcomm QCS6490 (Proxy)'
- 魔方派 3: 'Qualcomm QCS6490 (Proxy)'
将模型部署到 NPU(Python)
以部署 Lightweight-Face-Detection 模型为示例。
运行示例代码库
所有 AI Hub 模型都附带一个示例代码库。这是理想的入门起点。代码库准确地展示了模型运行流程。它展示了网络输入的要求,以及如何解析输出(如,将输出张量映射到边界框)。示例代码库尚未支持 NPU 或 GPU 加速。在将此模型移至 NPU 之前,我们首先了解一下正确的输入/输出格式。
在 Lightweight-Face-Detection 的AI Hub页面上,点击“Model repository”,访问README文件。该文件包含运行示例代码库的具体说明。
如需部署此模型,请在开发板上打开终端或建立SSH会话,并执行以下操作:
1️⃣ 创建一个新的虚拟环境(venv)并安装一些基础包:
mkdir -p ~/aihub-demo
cd ~/aihub-demo
python3 -m venv .venv
source .venv/bin/activate
pip3 install numpy setuptools Cython shapely
2️⃣ 将一张带有人脸的图像(640x480 分辨率,JPG 格式)下载到您的开发板上,例如:
wget https://cdn.edgeimpulse.com/qc-ai-docs/example-images/three-people-640-480.jpg

输入分辨率:AI Hub 模型对输入 数据有尺寸要求。可以在“技术细节 > 输入分辨率”下找到所需的分辨率(高度 x 宽度,此处 480x640 => 640x480 为宽 x 高)。也可通过查看TFLite或ONNX文件中输入张量的尺寸获取该信息。
3️⃣ 按Facial Landmark Detection模型的“Example & Usage”章节下的说明进行操作:
# Install the example (add --no-build-isolation)
pip3 install --no-build-isolation "qai-hub-models[face-det-lite]"
# Run the example
# Use --help to see all options
python3 -m qai_hub_models.models.face_det_lite.demo --quantize w8a8 --image ./three-people-640-480.jpg --output-dir out/
在 out/FaceDetLitebNet_output.png 中找到输出图像。
如果通过 SSH 连接,则可以通过以下方式将输出图像复制回主机:
# Find IP via: ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
# Then: (replace 192.168.1.148 by the IP address of your development kit)
scp ubuntu@192.168.1.148:~/aihub-demo/out/FaceDetLitebNet_output.png ~/Downloads/FaceDetLitebNet_output.png

4️⃣ 好的,现在我们已经拥有了一个可运行的模型。例如,在魔方派 3 上,运行此模型每次推理需要 189.7 毫秒。
将模型移植到NPU
至此,我们已获得一个可运行的参考模型,接下来将在NPU上运行该模型。您需要完成以下三个部分。
1️⃣ 对数据进行预处理,例如将图像转换为可以传递给神经网络的特征。
2️⃣ 将模型导出为 ONNX 或者 TFLite,并通过 LiteRT or ONNX Runtime 运行模型。
3️⃣ 对输出进行后处理,例如将神经网络的输出转换为面部的边界框。
该模型较为直观,可通过 LiteRT 和 ONNX Runtime 进行了解。然而,数据预处理与输出后处理的代码可能并非如此简单。
预处理输入
对于图像模型,大多数AI Hub模型接受的输入矩阵格式为 (HEIGHT, WIDTH, CHANNELS) (LiteRT) 或 (CHANNELS, HEIGHT, WIDTH) (ONNX),且数值需归一化至0到1之间。若输入为单通道图像,需先将其转换为灰度图。若模型已量化(绝大多数情况如此),还需读取zero_point和scale,并对像素值进行相应缩放(在LiteRT中操作较为简便,因其内置量化参数,而ONNX则不包含这些参数)。通常量化模型的输入数据会线性缩放至0..255(uint8)或-128..127(int8)范围。这部分处理相对简单。下面示例代码中的(def load_image_litert)函数展示了完整的Python实现。
然而需要特别注意的是上述处理方式并非绝对通用,正因如此才需要参考AI Hub示例代码。每个示例都提供了精确的输入缩放实现代码。在我们当前的示例Lightweight-Face-Detection中,输入的张量维度为(480, 640, 1)。但值得注意的是,预处理代码并未将图像转换为灰度图,而是直接提取了RGB图像的蓝色通道:
img_array = img_array.astype("float32") / 255.0
img_array = img_array[np.newaxis, ...]
img_tensor = torch.Tensor(img_array)
img_tensor = img_tensor[:, :, :, -1] # HERE WE TAKE BLUE CHANNEL, NOT CONVERT TO GRAYSCALE
这类细节极易出错。因此,当您发现自己的实现与AI Hub示例结果不一致时:请仔细阅读示例代码。对于非图像类输入(如音频数据),这一原则更为重要。请务必通过演示代码来理解模型真正的输入预期。